﻿#define _CRT_SECURE_NO_WARNINGS 1


//课程内容训练：
//#include<stdio.h>
//int main()
////{
////	printf("%d\n", 'A');
////	return 0;
////
////}
//
//{
//	/*int a,b,c;
//	a = 5;
//	c = ++a;
//	b = ++c, c++, ++a, a++;
//	b += ++a + c;
//	printf("a = % d b = % d c = % d\n:", a, b, c);*/
//	int a, b, m, n;
//	scanf("%d%d", &a, &b);
//	m = a / b;
//	n = a % b;
//	printf("%d%d,", m, n);
//	//printf("%5d\n", 123456);
//
//	return 0;
//
//}
//
//#include<stdio.h>
//int main()
//{
//	int n = 100;
//	printf("%d\n", n); //printf打印整型
//	printf("%c\n", 'q'); //printf打印字符
//	printf("%lf\n", 3.14); //printf打印双精度浮点型
//	return 0;
//}
//
//#include<stdio.h>
//int main()
//{
//	printf("%c\n", 'Q');
//	printf("%c\n", 77);//这⾥的77是字符Q的ASCII码值，也是可以正常打印的
//	return 0;
//}

//#include<stdio.h>
//int main()
//{
//	printf("%s\n", "abcd");
//	printf("%s\n", "hello");
//	return 0;
//}

//#include<stdio.h>
//int main()
//{
//	char arr1[] = { 'a','b','c' };//arr1数组中存放三个字符
//	char arr2[] = "abc";//arr2数组中存放一个字符串
//	printf("%s\n", arr1);
//	printf("%s\n", arr2);
//	return 0;
//}

//#include<stdio.h>
//int main()
//{
//	;//空语句
//	return 0;
//}

//#include<stdio.h>
//int main()
//{
//	int a = 20;
//	int b = 0;
//	b = a + 5; //表达式语句
//	return 0;
//}


/*这是注释*/
//这也是注释


#include<stdio.h>
//#include <string.h>
//#include <stdbool.h>
//int main()
//{
//	int i = 0;
//	i = 3;
//	printf("%d\n", i);
//	return 0;
//}


//
//int main()
//{
	//printf("abc\ndfe\n");//"\n"-->换行
	//printf("%c\n",'\''); //"\'"是表示字符常量
	//printf("c:\test\test.c\n"); //"\t"是一个制表符
	//printf("%c\n",'\130'); //'\ddd'是表示1~3个八进制的数字
	//printf("%c\n", '\x30'); //'\xdd'中dd表示1~2个十六进制的数字
	/*int len = strlen("abc");  //strlen字符的长度
	printf("%d\n",len);*/


//int main()
//
//
//{
//	printf("%d\n", sizeof(char));
//	printf("%d\n", sizeof(bool));
//	printf("%d\n", sizeof(short));
//	printf("%d\n", sizeof(int));
//	printf("%d\n", sizeof(long));
//	printf("%d\n", sizeof(long long));
//	printf("%d\n", sizeof(float));
//	printf("%d\n", sizeof(double));
//	printf("%d\n", sizeof(long double));
//}
//
	//signed int m;//有符号的 -- 既可能存正数，又可能存负数，就用signed
	//unsigned int q;//无符号的 -- 只能可能存0 和正数，就又unsigned\
	//%d -- 打印有符号的整型
    //%u -- 打印无符号的整型



	//变量创建
	//int num;
	//int age;
	//int weigh;
	//int c;

	//变量初始化
	//int num = 10;
	//int weigh = 50;
	//int age = 20;
	//int c = 0;

	//return 0;
//}


//全局变量和局部变量：如果全局变量和局部变量名字一样，则vs2019会对局部变量优先使用。两者名字尽量不要一样。
//int a = 100;//全局变量
//int main()
//{
//	int b = 20;//局部变量
//	printf("%d\n", b);
//	printf("%d\n", a);
//
//
//	return 0;
//}


//%f -- 打印float 类型的小数
//%lf -- 打印double类型的小数
//默认情况下小数点后打印6位小数

//c = b = a + 3;//连续赋值，从右向左依次赋值的。

//a++;//后置++：先使用，再+1
//++a;//前置++：先+1，再使用

//a--;//后置--：先使用，再-1
//a--;//前置--：先-1，再使用

//一个关于scanf的简短代码
//int main()
//{
//	int a = 0;//对a的初始化
//	printf("请输入成绩：\n");//输入一个值，用scanf
//	scanf("%d", &a); //&是取地址
//	printf("成绩是：%d\n", a);
//	return 0;
//}

//int main()
//{
//	int year = 0;
//	int month = 0;
//	int day = 0;
//	scanf("%d%d%d", &year, &month, &day);
//	printf("%d%-d%-d\n", year, month, day);
//	return 0;
//}




//练习：输入一个整数，并判断是否为奇数
//if语句:
//int main()
//{
//	int a = 0;
//	scanf("%d", &a);
//	if (a % 2 == 1)
//		printf("奇数\n");
//	return 0;
//}

//输入一个整数，并判断是否为奇偶数
//int main()
//{
//	int a = 0;
//	scanf("%d", &a);
//	if (a % 2 == 1)
//		printf("奇数\n");
//	else
//		printf("偶数\n");
//	return 0;
//}

//输入一个年龄，大于等于18岁为成年，反则未成年
//int main()
//{
//	int age = 0;
//	scanf("%d", &age);
//	if (age >= 18)
//		printf("成年\n");
//	else
//		printf("未成年\n");
//	return 0;
//}

//要求输入一个整数，判断输入整数是零，还是正数或负数
// 方法一：
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	if (n == 0)
//		printf("输入的值是零\n");
//	else
//		if (n > 0)
//			printf("输入的值是正数\n");
//		else
//			printf("输入的值是负数\n");
//	return 0;
//}

//方法二：
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	if (n == 0)
//		printf("输入的值是0\n");
//	else
//	{
//		if (n > 0)
//			printf("输入的值是正数\n");
//		else
//			printf("输入的值是负数\n");
//	}
//   return 0;
//}

//输入一个整数，如果是正数，再判断是奇数还是偶数，并输出；如果不是正数则输出：非正数。
//int main()
//{
//	int m = 0;
//	scanf("%d", &m);
//	if (m > 0)
//	{
//		if (m % 2 == 0)
//		//注意此处的判断，如果m%2==1，则表示一开始输入的数判断为奇数，下面的代码要对应不然会出错。如果m%2==0,则表示输入的数为偶数。
//			printf("输入的值是偶数\n");
//		else
//			printf("输入的值是奇数\n");
//	}
//	else
//	{
//		printf("输入的值是非正数");
//	}//只有一个语句的时候，大括号可有可无
//
//	return 0;
//}



//输入一个人的年龄
//如果年龄 < 18岁，打印"少年"
//如果年龄在18岁至44岁打印"青年"
//如果年龄在45岁至59岁打印"中老年"
//如果年龄在60岁至89岁打印"老年"
//如果90岁及以上打印"老寿星"

//int main()
//{
//	int age = 0;
//	scanf("%d", &age);
//	if (age < 18)
//		printf("少年\n");
//	else if (age <= 44)
//		printf("青年\n");
//	else if (age <= 59)
//		printf("中老年\n");
//	else if (age <= 89)
//		printf("老年\n");
//	else if (age > 90)
//		printf("老寿星\n");
//
//	return 0;
//}


//输入任意一个整数值，计算除3之后的余数
//int main()
//{
//	int i = 0;
//	scanf("%d", &i);
//	if (i % 3 == 0)
//		printf("余数是0\n");
//	else if (i % 3 == 1)
//		printf("余数是1\n");
//	else
//		printf("余数是2\n");
//
//	return 0;
//}


//switch语句
//输入任意一个整数值，计算除3之后的余数

//int main()
//{
//	int i = 0;
//	scanf("%d", &i);
//	switch (i % 3)
//	{
//	case 0:
//		printf("余数是0\n");
//		break;
//	case 1:
//		printf("余数是1\n");
//		break;
//	case 2:
//		printf("余数是2\n");
//		break;
//	}
//
//	return 0;
//}

//输入一个1~7的数字，打印对应的星期几
//例如：
//输入：1   输出：星期一
//输入：2   输出：星期二
//输入：3   输出：星期三
//输入：4   输出：星期四
//输入：5   输出：星期五
//输入：6   输出：星期六
//输入：7   输出：星期天

//int main()
//{
//	int m = 0;
//	scanf("%d", &m);
//	switch (m)
//	{
//	case 1:
//		printf("星期一\n");
//		break;
//	case 2:
//		printf("星期二\n");
//		break;
//	case 3:
//		printf("星期三\n");
//		break;
//	case 4:
//		printf("星期四\n");
//		break;
//	case 5:
//		printf("星期五\n");
//		break;
//	case 6:
//		printf("星期六\n");
//		break;
//	case 7:
//		printf("星期七\n");
//		break;
//	}
//	return 0;
//}


// 1. 输入1~5，输出的是“工作日”;
//2. 输入6~7，输出“休息日”

//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	switch (n)
//	{
//	case 1:
//	case 2:
//	case 3:
//	case 4:
//	case 5:
//		printf("工作日\n");
//		break;
//	case 6:
//	case 7:
//		printf("休息日\n");
//		break;
//	default:
//		printf("输入错误，请重新输入\n");
//		break;
//	}
//	return 0;
//}


//while语句:

//if 语句和while语句的区别：看似一样表达式，但是if是选择结构，而while是循环结构
// if(表达式);          while(表达式);
//      语句;                    语句;

//下面写简单的代码来展示
//if语句：结果是输入3，则打印一个hehe
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	if (n > 0)
//	{
//		printf("hehe\n");
//	}
//	return 0;
//}

//while语句：结果是输入3，则打印无数个hehe
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	while (n > 0)
//	{
//		printf("hehe\n");
//	}
//	return 0;
//}


//打印1~10
//int main()
//{
//	int i = 1;
//	while (i <= 10)
//	{
//		printf("%d", i);
//		i++;
//	}
//	return 0;
//}

//输入一个正的整数，逆序打印这个整数的每一位
//例如：
//输入：1234，输出：4 3 2 1
//输入：521，输出：1 2 5

//思路：用1234除10-->得123余；123除10-->得12余3；12除10-->得1余2；1除10-->得0余1
//用521除10-->得52余1；52除10-->得5余2；5除10-->得0余1

//int main()
//{
//	int a = 0;
//	scanf("%d", &a);
//	while (a)
//	{
//		printf("%d\n", a % 10);
//		a = a/10;
//	}
//	return 0;
//}


//for循环语句
//在循环语句中使用最多的一个
//for(表达式1;表达式2;表达式3)；
//                          语句；

//打印1~10
//int main()
//{
//	int i = 0;
//	for (i = 1; i <= 10; i++)
//	{
//		printf("%d\n", i);
//	}
//	return 0;
//}


//计算1~100之间3的倍数的数字之和

//int main()
//{
//	int i = 0;
//	int sum = 0;
//	for (i = 1; i <= 100; i++)
//	{
//		if (i % 3 == 0)
//			sum +=1;
//	}
//	printf("%d\n", sum);
//	return 0;
//}


//do-while循环
//   do
//       语句;
//   while(表达式)；

//打印1~10
//int main()
//{
//	int i = 1;
//	do
//	{
//		printf("%d\n",i);
//		i++;
//	} while (i <= 10);
//	return 0;
//}

//输入一个正整数，计算这个整数是几位数？
//例如：
//输入：1234   输出：4
//输入：12      输出：2

//int main()
//{
//	int b = 0;
//	int cnt = 0;//计数器
//	scanf("%d", &b);//输入1234
//	do
//	{
//		cnt++;//加一位，变1；1-->2-->3-->4
//		b /= 10;//除掉一位，变0；123-->12-->1-->0，则结束
//	} while (b);
//	printf("%d\n", cnt);
//	return 0;
//}


//break和continue语句
// break-->永久的终止循环
// continue-->跳过本次循环

//while循环中的break和continue

//int main()
//{
//	int i = 1;
//	while (i <= 10)
//	{
//		if (i == 5)
//			//break;
//			//break在此作用是终止循环直接跳出，在printf还未打印出‘5’时，就跳出来，则结果是1 2 3 4
//			continue;
////continue在此作用是跳出本次循环，在i=4时，i不等于5，循环继续，当i=5时，continue就会跳出下面的语句，不会打印出‘5’，
////但是循环未终止，当打印出1 2 3 4时就会卡住不动死循环
//		printf("%d\n", i);
//		i++;
//	}
//	return 0;
//}

//int main()
//{
//	int i = 0;
//	while (i <= 10)
//	{
//		i++;
//		if (i == 5)
//			continue;//由上面可知，不会打印5，但后面会继续循环进行，则结果是1 2 3 4 6 7 8 9 10
//		printf("%d\n", i);
//	}
//	return 0;
//}


//for循环中的break和continue
//int main()
//{
//	int i = 1;
//	for (i = 1; i <= 10; i++)
//	{
//		if (i == 5)
//			//break;//结果是1 2 3 4
//			continue;//结果是1 2 3 4 6 7 8 9 10
//		printf("%d\n", i);
//	}
//	return 0;
//}


//do  while循环中的break和continue
//int main()
//{
//	int i = 1;
//	do
//	{
//		if (i == 5)
//			//break;//结果是1 2 3 4
//			continue;//结果是1 2 3 4，并且卡住不动死循环
//		printf("%d\n", i);
//		i++;
//	} while (i <= 10);
//	return 0;
//}

//语法上支持：for循环的初始化、判断、调整三个部分可以省略
//但是是否要省略，得看逻辑,而且要慎重
// 如果判断部分省略了，判断部分恒为真，这个循环就是死循环

//判断部分省略
//int main()
//{
//	for (; ;)//结果是无限循环打印“hehe”
//	{
//		printf("hehe\n");
//	}
//	return 0;
//}


//找出100~200之间的素数，并打印在屏幕上。
//素数也叫质数，就是只能被1和它本身整除的数字

// 1. 产生100~200之间数字-- for i
//2. 判断生成的i是否为素数
//   如果是素数就打印
//怎么判断i是否是素数呢？
//使用2~i-1之间的数字去试除i，如果都不能整除i，那么i就是素数，否则就不是素数
//   2~i-1之间的数字 for
//int main()
//{
//	int i = 0;
//	for (i = 100; i <= 200; i++)
//	{
//		int flag = 1;
//		int j = 0;
//		for (j = 2; j <= i-1; j++)//产生2~i-1之间的数字，比如i是100，则产生2~99的数字
//		{
//			if (i % j == 0)//拿‘j’去除i，若6被2整除，余数为0，则不是素数
//			{
//				flag = 0;
//				break;
//			}
//		}
//		if (flag == 1)//若7被6除，有余数，则是素数
//			printf("%d\n", i);
//	}	
//	return 0;
//}


//goto语句：尽量少用，不恰当的用goto语句容易使代码跳乱
//int main()
//{
//    printf("hehe\n");
//    goto next;//goto语句可以跳转到设置好的语句中，就这里的"goto next"就会跳转到下面的“next”的语句中
//    printf("haha\n");
//
//next:
//    printf("跳过了haha的打印\n");
//    return 0;
//}

//goto语句不是必须使用的，肯定有其他方式来实现
//举例：关机程序--程序运行起来后，就会电脑在1分钟内关机，但是输入我是猪，就会取消关机

//system是一个函数，可以执行系统命令-->包含的头文件：#include <windows.h>
#include <windows.h>
#include <string.h>
//int main()
//{
//	char input[20] = {0};
//	system("shutdown -s -t 60");
//again:	
//	printf("请注意你的电脑将在一分钟内关机，请输入:我是猪,就取消关机\n");
//	scanf("%s", input);
//	// strcmp 如果发现两个字符串相等，会返回0
//	if (0 == strcmp(input, "我是猪"))//两个字符串，能使用==比较大小吗？不能！应用使用strcmp-比较字符串大小的库函数
//	{
//		system("shutdown -a");
//	}
//	else
//	{
//		goto again;
//	}
//	return 0;
//}
//


//int main()
//{
//	char input[20] = { 0 };
//	system("shutdown -s -t 60");
//	while(1)//死循环
//	{
//		printf("请注意你的电脑将在一分钟内关机，请输入：我是猪，就取消关机\n");
//		scanf("%s", input);
//		if (0 == strcmp(input, "我是猪"))
//		{
//			system("shutdown -a");
//			break;
//		}
//	}
//
//	return 0;
//}

//int main()
//{
//	/*char str[] = "hello bit";
//	printf("%d %d\n", sizeof(str), strlen(str));*/
//	int arr[] = { 1,2,(3,4),5 };
//	printf("%d\n", sizeof(arr));
//	return 0;
//
//}


//数组：课程内容练习

//数组元素的输入
//int main()
//{
//	int i = 0;
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,5 };
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d\n", arr[i]);
//	}
//
//	return 0;
//}

//数组的输入
//int main()
//{
//	int i = 0;
//	int arr[10] = { 1,5,6,7,4,3,0,8,9,2 };
//	for (i = 0; i < 10; i++)
//	{
//		scanf("%d", &arr[i]);
//	}
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d", arr[i]);
//	}
//
//	return 0;
//}

//依次打印数组元素的地址：x64是64位打印地址长，x86是32位打印地址短
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("&arr[%d]=%p\n",i,&arr[i]);//%p是打印地址的意思
//	}
//
//	return 0;
//}

//sizeof(str)：获取数组的总大小
// strlen(str): 获取字符串中有效字符的个数
//打印sizeof空间大小，单位是字节，40个字节
//int main()
//{
//	int arr[10] = {0};
//	printf("%d\n", sizeof(arr));
//	return 0;
//}

//打印计算一个元素大小,4个字节
//int main()
//{
//	int arr[10] = {0};
//	printf("%d\n", sizeof(arr[0]));
//	return 0;
//}

//打印元素个数,用总空间除去一个元素的大小，就得出元素个数
//int main()
//{
//	int arr[10] = {0};
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	printf("%d\n", sz);
//	return 0;
//}


//二维数组表示:
// 对于二维数组int array[M][N], 说明如下：
//1. M和N都必须为常数，
//2. M代表数组有M行，N代表每行中有N个元素
//3. 其中M可以省略，省略后必须给出初始化表达式，编译器从初始化结果中推断数组有多少行
//4. N一定不能省略，因为N省略了就不能确定一行有多少个元素，也不能确定数组有多少行
 
//int main()
//{
//	int arr[3][5] = { 1,2,3,4,2, 5,6,7,8,9, 6,4,8,9,7 };//1,2,3,4,2是第一行(0)，5,6,7,8,9是第二行(1)，6,4,8,9,7是第三行(2)
//	//1 //是第一列(0) 2//是第二例(1) 3//是第三列(2) 4//是第四列(3) 2是//第五列(4)          
//	//5            6           7           8           9
//	//6            4           8           9           7
//	return 0;
//}
//
//二维数组元素全部的打印
//int main()
//{
//	int arr[3][5] = { 1,2,3,4,2, 5,6,7,8,9, 6,4,8,9,7 };
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < 3; i++)
//	{
//		for (j = 0; j < 5; j++)
//		{
//			scanf("%d", &arr[i][j]);//输入
//		}
//	}
//	for(i=0;i<3;i++)
//	{
//		for (j = 0; j < 5; j++)
//		{
//			printf("%d ", arr[i][j]);
//		}
//		printf("\n");
//	}
//	return 0;
//}

//二维数组打印单个元素
//int main()
//{
//	int arr[3][5] = { 1,2,3,4,2, 5,6,7,8,9, 6,4,8,9,10 };
//	printf("%d", arr[2][4]);//这就是打印第三行第五列的元素
//	return 0;
//}

//打印二维数组全部元素的地址
//int main()
//{
//	int arr[3][5] = { 1,2,3,4,2, 5,6,7,8,9, 6,4,8,9,10 };
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < 3; i++)
//	{
//		for (j = 0; j < 5; j++)
//		{
//			printf("&arr[%d][%d]=%p\n", i, j, &arr[i][j]);
//		}
//	}
//	return 0;
//}

//C语言有c80 c89 c99 ...的标准，但c99标准是用的最多的
//system是执行系统命令的  sleep是休眠函数，单位毫秒1000毫秒=1秒，头文件<windows.h>  cls是清理屏幕里面的命令的意思

//练习1：多个字符从两端移动，向中间汇聚   冒泡排序
//编写代码，演⽰多个字符从两端移动，向中间汇聚
//welcome to bit!!!!!
//*******************
//w*****************!
//we***************!!
//wel*************!!!
//...
//welcome to bit!!!!!

//#include <string.h>
//#include<windows.h>
//int main()
//{
//	char arr1[] = "welcome to my world!!!!";
//	char arr2[] = "***********************";
//	int left = 0;
//	int right = strlen(arr1) - 1;
//	while (left <= right)//当左右两边的数移动到中间时，可能会有一个数一样，然如果left大于right就会出现溢出现象程序进行不了
//	{
//		arr2[left] = arr1[left];
//		arr2[right] = arr1[right];
//		printf("%s\n", arr2);
//		Sleep(1000);//设置每次替换隔一秒
//		system("cls");//全部打印完后会清屏
//		left++;
//		right--;
//	}
//	printf("%s\n", arr2);//因为system会出现清屏的现象，则还需要再打印一次
//
//	//size_t left = 0;
//	//size_t right = strlen(arr1)-1;
//	//
//	//while (left<=right)
//	//{
//	//  arr2[left] = arr1[left];
//	//	arr2[right] = arr1[right];
//	//	printf("%s\n", arr2);
//	//	Sleep(1000);//休眠，单位是毫秒
//	//	system("cls");
//	//	left++;
//	//	right--;
//	//}
//	//	printf("%s\n", arr2);
//
//	return 0;
//
//}

//二分查找（折半查找）：在有序的情况下，无序则不能
//1 2 3 4 5 6 7 8 9 10                  1 2 3 4 5 6 7 8 9 10
//当k=7，则要查找数字7，按数组下标来看是0 1 2 3 4 5 6 7 8 9,；7对于的下标为6,
//（0+9）/2=4,(0+9)是下标0和9相加，4是下标
//前面下标0~4被砍去，则从下标5~9开始查找：(5+9)/2=7,(5+9)是下标5和9相加，7是下标
//因为查找的数字对应下标是6,7>6，下标7~9被砍去，则从下标5~6开始查找：（5+6）/2=5,5是下标
//排除下标5，只剩下下标6，则（6+6）/2=6，因此就找到下标6的数字7

//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int k = 0;
//	scanf("%d", &k);
//	int sz = sizeof(arr) / sizeof(arr[0]);//10个数
//	int left = 0;//表示left是从下标0开始
//	
//	int right = sz - 1;//10-1=9,表示right是从下标9开始
//	
//	int flag = 0;//判断为真假
//	while (left <= right)
//	{
//		int mid = (left + right) / 2;//核心方法
//		if (arr[mid] < k)//当下标小于k时，左边取掉，再从mid+1开始
//		{
//			left = mid + 1;
//		}
//		else if (arr[mid] > k)//当下标大于k时，右边取得，再从mid-1开始
//		{
//			right = mid - 1;
//		}
//		else
//		{
//			printf("找到了，下标是:%d\n",mid);
//			flag = 1;
//			break;//跳出执行的循环，否则会无限循环下去
//		}
//
//	}
//	if (flag == 0)
//	{
//		printf("找不到了\n");
//	}
//
//	return 0;
//}
//
//注意求平均值的时候，当给的值特别大，会出现存在的问题,换一种方法写，也可以使用在数组里
//int main()
//{
//	int left = 2147483646;
//	int right = 214783646;
//	int mid = left + (right - left) / 2;
//	printf("%d\n", mid);
//
//	return 0;
//}


